package com.lg.concurrent.schedule;

import lombok.SneakyThrows;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

/**
 怎么获取线程结果
 implements Callable<String>
 通过Future获得异步执行结果时，要么调用阻塞方法get()，要么轮询看isDone()是否为true
 CompletableFuture Java 8开始引入
 改进了Future，可以传入回调对象，当异步任务完成或者发生异常时，自动调用回调对象的回调方法
 */
public abstract class CallableT {
    @SneakyThrows
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(4);
        // 定义任务:
        Task t = new Task();
        // 提交任务并获得Future:
        Future<List<String>> future = executor.submit(t);

        if (future.isDone()) {
            System.out.println(future.isDone());
        }
        // 从Future获取异步执行返回的结果:
        List<String> result = future.get();; // 阻塞 获取结果
        System.out.println("阻塞结束");
        System.out.println(result);

        executor.shutdown();
    }
}

class Task implements Callable<List<String>> {
    @Override
    public List<String> call() throws Exception {
        ArrayList<String> list = new ArrayList<>();
        list.add("11");
        list.add("22");
        Thread.sleep(1000 * 3);
        return list;
    }
}